<?php
/**
 * 版权信息工具类
 * 用于处理系统中版权信息的年份自动检测和更新
 */
class CopyrightUtils {
    /**
     * 获取当前年份
     * @return string 当前年份（4位数）
     */
    public static function getCurrentYear() {
        return date('Y');
    }
    
    /**
     * 生成版权信息文本
     * @param string $format 版权信息格式模板，其中%Y会被替换为当前年份
     * @return string 生成的版权信息
     */
    public static function getCopyrightText($format = '© %Y 慕念科技 版权所有') {
        return str_replace('%Y', self::getCurrentYear(), $format);
    }
    
    /**
     * 获取文件头部版权注释
     * @return string 文件头部的版权注释
     */
    public static function getFileHeaderComment() {
        return '// 版权所有 © ' . self::getCurrentYear() . ' 慕念科技. 保留所有权利.';
    }
    
    /**
     * 获取SQL文件头部版权注释
     * @return string SQL文件头部的版权注释
     */
    public static function getSqlFileHeaderComment() {
        return '-- 版权所有 © ' . self::getCurrentYear() . ' 慕念科技. 保留所有权利.';
    }
    
    /**
     * 批量更新项目中的所有版权信息年份
     * 注意：此函数会直接修改文件内容，请谨慎使用
     * @param string $projectPath 项目路径
     * @return array 更新结果
     */
    public static function batchUpdateCopyrightYear($projectPath) {
        $currentYear = self::getCurrentYear();
        $updatedFiles = 0;
        $skippedFiles = 0;
        $errorFiles = [];
        
        // 定义需要处理的文件类型和对应的版权信息模式
        $fileTypes = [
            '*.php' => [
                '/(\/\/\s*版权所有\s*©\s*)\d{4}(\s*慕念科技\.\s*保留所有权利\.)/' => '\1' . $currentYear . '\2'
            ],
            '*.sql' => [
                '/(--\s*版权所有\s*©\s*)\d{4}(\s*慕念科技\.\s*保留所有权利\.)/' => '\1' . $currentYear . '\2'
            ],
            '*.html' => [
                '/(©\s*)\d{4}(\s*慕念科技\s*版权所有)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*\|\s*慕念科技)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*-\s*让快递查询更简单！)/' => '\1' . $currentYear . '\2'
            ],
            '*.md' => [
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*-\s*让快递查询更简单！)/' => '\1' . $currentYear . '\2',
                '/(订单自主查询系统\s*©\s*)\d{4}(\s*版权所有)/' => '\1' . $currentYear . '\2'
            ]
        ];
        
        // 遍历所有文件类型
        foreach ($fileTypes as $pattern => $replacements) {
            // 在Windows系统中使用glob查找文件
            $files = self::globRecursive($projectPath . '/' . $pattern);
            
            foreach ($files as $file) {
                try {
                    $content = file_get_contents($file);
                    $originalContent = $content;
                    
                    // 应用所有替换模式
                    foreach ($replacements as $search => $replace) {
                        $content = preg_replace($search, $replace, $content);
                    }
                    
                    // 如果内容有变化，写回文件
                    if ($content !== $originalContent) {
                        file_put_contents($file, $content);
                        $updatedFiles++;
                    } else {
                        $skippedFiles++;
                    }
                } catch (Exception $e) {
                    $errorFiles[] = [
                        'file' => $file,
                        'error' => $e->getMessage()
                    ];
                }
            }
        }
        
        return [
            'updated' => $updatedFiles,
            'skipped' => $skippedFiles,
            'errors' => $errorFiles,
            'year' => $currentYear
        ];
    }
    
    /**
     * 递归查找文件
     * @param string $pattern 文件模式
     * @param int $flags 查找标志
     * @return array 找到的文件列表
     */
    private static function globRecursive($pattern, $flags = 0) {
        $files = glob($pattern, $flags);
        
        // 如果在Windows系统上运行，需要特殊处理
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // Windows下通过shell命令获取递归文件列表
            $dir = dirname($pattern);
            $filePattern = basename($pattern);
            
            $command = "cmd /c dir \"$dir\\$filePattern\" /s /b";
            $output = [];
            $returnVar = 0;
            
            exec($command, $output, $returnVar);
            
            if ($returnVar === 0) {
                $files = $output;
            }
        } else {
            // Linux/Unix系统下使用标准递归方法
            foreach (glob(dirname($pattern) . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) {
                $files = array_merge($files, self::globRecursive($dir . '/' . basename($pattern), $flags));
            }
        }
        
        return $files;
    }
}
    /**
     * 获取当前年份
     * @return string 当前年份（4位数）
     */
    public static function getCurrentYear() {
        return date('Y');
    }
    
    /**
     * 生成版权信息文本
     * @param string $format 版权信息格式模板，其中%Y会被替换为当前年份
     * @return string 生成的版权信息
     */
    public static function getCopyrightText($format = '© %Y 慕念科技 版权所有') {
        return str_replace('%Y', self::getCurrentYear(), $format);
    }
    
    /**
     * 获取文件头部版权注释
     * @return string 文件头部的版权注释
     */
    public static function getFileHeaderComment() {
        return '// 版权所有 © ' . self::getCurrentYear() . ' 慕念科技. 保留所有权利.';
    }
    
    /**
     * 获取SQL文件头部版权注释
     * @return string SQL文件头部的版权注释
     */
    public static function getSqlFileHeaderComment() {
        return '-- 版权所有 © ' . self::getCurrentYear() . ' 慕念科技. 保留所有权利.';
    }
    
    /**
     * 批量更新项目中的所有版权信息年份
     * 注意：此函数会直接修改文件内容，请谨慎使用
     * @param string $projectPath 项目路径
     * @return array 更新结果
     */
    public static function batchUpdateCopyrightYear($projectPath) {
        $currentYear = self::getCurrentYear();
        $updatedFiles = 0;
        $skippedFiles = 0;
        $errorFiles = [];
        
        // 定义需要处理的文件类型和对应的版权信息模式
        $fileTypes = [
            '*.php' => [
                '/(\/\/\s*版权所有\s*©\s*)\d{4}(\s*慕念科技\.\s*保留所有权利\.)/' => '\1' . $currentYear . '\2'
            ],
            '*.sql' => [
                '/(--\s*版权所有\s*©\s*)\d{4}(\s*慕念科技\.\s*保留所有权利\.)/' => '\1' . $currentYear . '\2'
            ],
            '*.html' => [
                '/(©\s*)\d{4}(\s*慕念科技\s*版权所有)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*\|\s*慕念科技)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统)/' => '\1' . $currentYear . '\2',
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*-\s*让快递查询更简单！)/' => '\1' . $currentYear . '\2'
            ],
            '*.md' => [
                '/(©\s*)\d{4}(\s*订单自主查询系统\s*-\s*让快递查询更简单！)/' => '\1' . $currentYear . '\2',
                '/(订单自主查询系统\s*©\s*)\d{4}(\s*版权所有)/' => '\1' . $currentYear . '\2'
            ]
        ];
        
        // 遍历所有文件类型
        foreach ($fileTypes as $pattern => $replacements) {
            // 在Windows系统中使用glob查找文件
            $files = self::globRecursive($projectPath . '/' . $pattern);
            
            foreach ($files as $file) {
                try {
                    $content = file_get_contents($file);
                    $originalContent = $content;
                    
                    // 应用所有替换模式
                    foreach ($replacements as $search => $replace) {
                        $content = preg_replace($search, $replace, $content);
                    }
                    
                    // 如果内容有变化，写回文件
                    if ($content !== $originalContent) {
                        file_put_contents($file, $content);
                        $updatedFiles++;
                    } else {
                        $skippedFiles++;
                    }
                } catch (Exception $e) {
                    $errorFiles[] = [
                        'file' => $file,
                        'error' => $e->getMessage()
                    ];
                }
            }
        }
        
        return [
            'updated' => $updatedFiles,
            'skipped' => $skippedFiles,
            'errors' => $errorFiles,
            'year' => $currentYear
        ];
    }
    
    /**
     * 递归查找文件
     * @param string $pattern 文件模式
     * @param int $flags 查找标志
     * @return array 找到的文件列表
     */
    private static function globRecursive($pattern, $flags = 0) {
        $files = glob($pattern, $flags);
        
        // 如果在Windows系统上运行，需要特殊处理
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            // Windows下通过shell命令获取递归文件列表
            $dir = dirname($pattern);
            $filePattern = basename($pattern);
            
            $command = "cmd /c dir \"$dir\\$filePattern\" /s /b";
            $output = [];
            $returnVar = 0;
            
            exec($command, $output, $returnVar);
            
            if ($returnVar === 0) {
                $files = $output;
            }
        } else {
            // Linux/Unix系统下使用标准递归方法
            foreach (glob(dirname($pattern) . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $dir) {
                $files = array_merge($files, self::globRecursive($dir . '/' . basename($pattern), $flags));
            }
        }
        
        return $files;
    }
}